package com.xyh.system.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.xyh.system.model.Menu;

import java.util.List;

/**
 * <p>
 * 服务类
 * </p>
 *
 * @author kyle
 * @since 2021-01-05
 */
public interface IMenuService extends IService<Menu> {

    /**
     * 根据用户名获取该用户拥有的树形菜单
     *
     * @return 有树状层级关系的Menu集合
     */
    List<Menu> selectCurrentUserMenuTree();

    /**
     * 查询所有的menu，并组装层级关系
     *
     * @return 有树状层级关系的Menu集合
     */
    List<Menu> selectAllTree();

    /**
     * 根据用户名获取该用户拥有的树形菜单
     *
     * @param username 用户名
     * @return 封装好的树状层级关系的Menu集合
     */
    List<Menu> selectMenuTreeByUsername(String username);

    /**
     * 将所有子集Menu循环出来,这个方法主要是对selectAllTree()方法的再封装
     * selectAllTree()方法是直接从数据库中读取的有父子层级关系的集合
     * 而getLeafNodeMenu()是为了将父子层级关系剥离出来，只取子集中的数据
     * 目的是为了更加有序
     *
     * @return 子集menu的集合
     */
    List<Menu> getLeafNodeMenu();

    /**
     * 根据父id查询该id的菜单有所有子集菜单
     *
     * @param parentId 菜单父id
     * @return 父级菜单下的所有子集菜单(不包括子集的子集)
     */
    List<Menu> selectChildMenuByParentId(Integer parentId);

    /**
     * 获取全部菜单树，并且手动添加顶层跟目录
     *
     * @return
     */
    List<Menu> getAllMenuTreeAndRoot();

    /**
     * 查询带功能权限的菜单树,并组装根节点
     *
     * @return Menu菜单树集合
     */
    List<Menu> getAllMenuAndCountOperatorTreeAndRoot();

    /**
     * 调整菜单排序
     *
     * @param currentId 需要调整的菜单id
     * @param swapId    与之交换的菜单id
     */
    void swapSort(Integer currentId, Integer swapId);

    /**
     * 新增菜单节点，并且刷新过滤器链
     *
     * @param menu
     * @return
     */
    boolean insert(Menu menu);

    /**
     * 删除菜单节点，如果存在下级节点则一并删除
     *
     * @param menuId
     * @return
     */
    boolean removeByParentIdEqMenuId(Integer menuId);
}
